import _fetch from './Fetch'

// 能够防止被包裹的组件在卸载后使用 setState 而报错（异步结果返回的时候组件已经卸载的情况）
export let injectUnmount = target => {
  // 改装componentWillUnmount，销毁的时候记录一下
  try {
    let next = target.prototype.componentWillUnmount
    target.prototype.componentWillUnmount = function () {
      if (next) next.call(this, ...arguments);
      this.unmount = true
    }
    // 对setState的改装，setState查看目前是否已经销毁
    let setState = target.prototype.setState
    target.prototype.setState = function () {
      if (this.unmount) return;
      setState.call(this, ...arguments)
    }
  } catch { }
}

// 对当前页面可用的cookie进行处理的函数
export const CookieUtil = {
  get: function (name) {
    // 调用get直接返回userMessage对象，如果没有返回null
    return localStorage.getItem(name) || null;
  },
  /**
   *
   * @param {string} name  要存储的数据的key
   * @param {json} value  要存储数据的值
   * @param {number} expires 过期时间戳
   */
  set: function (name, value, expires) {
    let valueObj = JSON.parse(value)
    valueObj.expires = expires
    localStorage.setItem(name, JSON.stringify(valueObj));
  },

  /**
   *
   * @param {string} name 要删除的local的key
   */
  unset: function (name) {
    localStorage.removeItem(name)
  },
  // 下面需要修改
  // 获取权限列表, 若已经销毁则返回{}
  get permissionList() {
    return JSON.parse(CookieUtil.get('userMessage')) ? JSON.parse(CookieUtil.get('userMessage')).permissionList : []
  },
  // 获取角色信息 若已经销毁则返回{}
  get roleList() {
    return JSON.parse(CookieUtil.get('userMessage')) ? JSON.parse(CookieUtil.get('userMessage')).roleList : {}
  },
  // 获取用户信息 若已经销毁则返回{}
  get user() {
    return JSON.parse(CookieUtil.get('userMessage')) ? JSON.parse(CookieUtil.get('userMessage')).user : {}
  },

};

/**
 * 把深度树展成平面树
 *
 * @param {Array} deepObject 要遍历的树
 * @param {*} [result={}] 返回的平面树
 * @param {string} [deepByKey='children'] 通过哪个属性进行深度查找
 * @param {string} [deepKey='value']  返回的平面树中对象的属性
 * @param {string} [deepValue='title'] 返回的平面树中对象的属性值
 * @return {*}
 */
export const planeTree = (deepObject, result = {}, deepByKey = 'children', deepKey = 'value', deepValue = 'title') => {
  if (!deepObject) {
    return result;
  }
  deepObject.forEach(item => {
    result[item[deepKey]] = item[deepValue];
    if (item[deepByKey]) {
      planeTree(item[deepByKey], result, deepByKey, deepKey, deepValue);
    }
  });
  return result;
}

/**
 * 导出文件模板
 * @param {Object} ajaxConfig {url, method, data/params}
 * @param {Obejct} param
 * @param {Function} callback
 * @returns
 */
export const downloadFileTemplate = (ajaxConfig, {
  fileName,
  fileType,
  fileExt
}, callback) => {
  let token = localStorage.getItem('token')
  if (!token) return;
  const config = {
    ...ajaxConfig,
    headers: {
      'Authorization': token,
      'Content-Type': 'application/json'
    },
    responseType: "blob",
  }
  _fetch(config).then(res => {
    const blob = res.data;
    const urlObject = window.URL || window.webkitURL || window
    const export_blob = new Blob([blob], {
      type: fileType
    })
    const a = document.createElement('a') // 利用a标签特性下载
    a.style.display = 'none';
    const url = urlObject.createObjectURL(export_blob);
    a.href = url;
    a.setAttribute('download', `${fileName}.${fileExt}`)
    document.body.appendChild(a);
    a.click();
    document.body.removeChild(a);
    callback && callback()
  })
}